﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PathControl : MonoBehaviour
{

    public float speed;
    public string pathName;
    Hashtable args = new Hashtable();
    Hashtable argsRevers = new Hashtable();
    void Start()
    {

        //键值对儿的形式保存iTween所用到的参数  
        

        //这里是设置类型，iTween的类型又很多种，在源码中的枚举EaseType中  
        //例如移动的特效，先震动在移动、先后退在移动、先加速在变速、等等  
        args.Add("easeType", iTween.EaseType.linear);

        //移动的速度，  
        args.Add("speed", speed);  
        //移动的整体时间。如果与speed共存那么优先speed  
        //args.Add("time", 10f);
        //这个是处理颜色的。可以看源码的那个枚举。  
        args.Add("NamedValueColor", "_SpecColor");
        //延迟执行时间  
        args.Add("delay", 0.1f);

        //是否让游戏对象始终面朝路径行进的方向，拐弯的地方会自动旋转。  
        args.Add("orienttopath", true);
        //移动的过程中面朝一个点，当“orienttopath”为true时该参数失效  
        //args.Add("looktarget", Vector3.zero);
        //游戏对象看向“looktarget”的秒数。  
        //args.Add("looktime", 1.1);


        //游戏对象移动的路径可以为Vector3[]或Transform[] 类型。可通过iTweenPath编辑获取路径  
        //Vector3[] testPath = { new Vector3(0, 0, 0), new Vector3(0, 1, 0), new Vector3(0, 1, 1), new Vector3(1, 1, 1), new Vector3(1, 5, 1) };
        //args.Add("path", testPath);
        //是否移动到路径的起始位置（false：游戏对象立即处于路径的起始点，true：游戏对象将从原是位置移动到路径的起始点）  
        args.Add("movetopath", false);

        //当包含“path”参数且“orienttopath”为true时，该值用于计算“looktarget”的值，表示游戏物体看着前方点的位置，（百分比，默认0.05）  
        //args.Add("lookahead", 0.01);

        //限制仅在指定的轴上旋转  
        //args.Add("axis", "x");
        //是否使用局部坐标(默认为false)  
        //args.Add("islocal", false);


        //三个循环类型 none loop pingPong (一般 循环 来回)    
        //args.Add("loopType", "none");  
        //args.Add("loopType", "loop");   
        args.Add("loopType", iTween.LoopType.none);

        //处理移动过程中的事件。  
        //开始发生移动时调用AnimationStart方法，5.0表示它的参数  
        args.Add("onstart", "AnimationStart");
        args.Add("onstartparams", 5.0f);
        //设置接受方法的对象，默认是自身接受，这里也可以改成别的对象接受，  
        //那么就得在接收对象的脚本中实现AnimationStart方法。  
        args.Add("onstarttarget", gameObject);


        //移动结束时调用，参数和上面类似  
        args.Add("oncomplete", "AnimationEnd");
        args.Add("oncompleteparams", "end");
        args.Add("oncompletetarget", gameObject);

        //移动中调用，参数和上面类似  
        args.Add("onupdate", "AnimationUpdate");
        args.Add("onupdatetarget", gameObject);
        args.Add("onupdateparams", true);

        // x y z 标示移动的位置。  
        //args.Add("x", -5);
        //args.Add("y", 1);
        //args.Add("z", 1);
        //当然也可以写Vector3  
        //args.Add("position",Vectoe3.zero);  

        args.Add("path", iTweenPath.GetPath(pathName));
        //获取逆向路径
        //args.Add("path", iTweenPath.GetPathReversed(pathName));



        //反向移动
        argsRevers.Add("easeType", iTween.EaseType.linear);
        argsRevers.Add("speed", speed);
        argsRevers.Add("NamedValueColor", "_SpecColor");
        argsRevers.Add("delay", 0.1f);
        argsRevers.Add("orienttopath", false);
        argsRevers.Add("axis", "x");
        argsRevers.Add("loopType", iTween.LoopType.none);
        argsRevers.Add("onstart", "AnimationStart");
        argsRevers.Add("onstartparams", 5.0f);
        argsRevers.Add("onstarttarget", gameObject);
        argsRevers.Add("oncomplete", "AnimationEnd");
        argsRevers.Add("oncompleteparams", "end");
        argsRevers.Add("oncompletetarget", gameObject);
        argsRevers.Add("onupdate", "AnimationUpdate");
        argsRevers.Add("onupdatetarget", gameObject);
        argsRevers.Add("onupdateparams", true);
        argsRevers.Add("path", iTweenPath.GetPathReversed(pathName));

        transform.GetChild(0).gameObject.SetActive(false);

    }

    public void InitPlay()
    {

        //GameObject obj = new GameObject();
        //GameObject temp = transform.GetChild(0).gameObject;
        //obj.transform.parent = transform;
        //obj.transform.localPosition = Vector3.zero;
        //obj.transform.rotation = Quaternion.Euler(new Vector3(-90, 0, 0));
        //temp.transform.parent = obj.transform;
        //temp.transform.rotation = Quaternion.identity;
        //最终让改对象开始移动  
        transform.GetChild(0).gameObject.SetActive(true);

        iTween.MoveTo(gameObject, args);

    }

    public void PlayBack()
    {
        iTween.MoveTo(gameObject, argsRevers);
    }

    private void Update()
    {
        if(Input.GetKeyDown(KeyCode.S))
        {
            InitPlay();
        }
        if(Input.GetKeyDown(KeyCode.M))
        {
            PlayBack();
        }
    }
    //对象移动中调用  
    void AnimationUpdate(bool f)
    {
        //Debug.Log("update :" + f);
    }
    //对象开始移动时调用  
    void AnimationStart(float f)
    {
        //Debug.Log("start :" + f);
    }
    //对象移动时调用  
    void AnimationEnd(string f)
    {
        //Debug.Log("end : " + f);
    }
}
